//
// Created by madison on 2022/1/6.
//

#include <iostream>

using namespace std;

int main() {
    int var1;
    char var2[10];

    cout << "var1 变量的地址： ";
    cout << &var1 << endl;

    cout << "var2 变量的地址： ";
    cout << &var2 << endl;

    int var = 20;   // 实际变量的声明
    int *ip;        // 指针变量的声明

    ip = &var;       // 在指针变量中存储 var 的地址

    cout << "Value of var variable: ";
    cout << var << endl;

    // 输出在指针变量中存储的地址
    cout << "Address stored in ip variable: ";
    cout << ip << endl;

    // 访问指针中地址的值
    cout << "Value of *ip variable: ";
    cout << *ip << endl;

    //  Null 指针
    int *ptr = NULL;

    cout << "ptr 的值是 " << ptr;

    void fun();
    fun();
    void fun1();
    fun1();
    void fun2();
    fun2();
    void fun3();
    fun3();
    void fun4();
    fun4();
    void fun5();
    fun5();
    void fun6();
    fun6();
    return 0;
}

const int MAX = 3;

void fun() {
    int var[MAX] = {10, 100, 200};
    int *ptr;

    // 指针中的数组地址
    ptr = var;
    for (int i = 0; i < MAX; i++) {
        cout << "Address of var[" << i << "] = ";
        cout << ptr << endl;

        cout << "Value of var[" << i << "] = ";
        cout << *ptr << endl;

        // 移动到下一个位置
        ptr++;
    }
}

void fun1() {
    int var[MAX] = {10, 100, 200};
    int *ptr;

    // 指针中最后一个元素的地址
    ptr = &var[MAX - 1];
    for (int i = MAX; i > 0; i--) {
        cout << "Address of var[" << i << "] = ";
        cout << ptr << endl;

        cout << "Value of var[" << i << "] = ";
        cout << *ptr << endl;

        // 移动到下一个位置
        ptr--;
    }
}

void fun2() {
    int var[MAX] = {10, 100, 200};
    int *ptr;

    // 指针中第一个元素的地址
    ptr = var;
    int i = 0;
    while (ptr <= &var[MAX - 1]) {
        cout << "Address of var[" << i << "] = ";
        cout << ptr << endl;

        cout << "Value of var[" << i << "] = ";
        cout << *ptr << endl;

        // 指向上一个位置
        ptr++;
        i++;
    }
}

// 指针数组
void fun3() {
    int var[MAX] = {10, 100, 200};
    int *ptr;

    // 指针中的数组地址
    ptr = var;
    for (int i = 0; i < MAX; i++) {
        cout << "var[" << i << "]的内存地址为 ";
        cout << ptr << endl;

        cout << "var[" << i << "] 的值为 ";
        cout << *ptr << endl;

        // 移动到下一个位置
        ptr++;
    }


    for (int i = 0; i < MAX; i++) {
        *var = i;    // 这是正确的语法
        // var++;       // 这是不正确的
    }
}

void fun4() {
    int var[MAX] = {10, 100, 200};
    int *ptr[MAX];

    for (int i = 0; i < MAX; i++) {
        ptr[i] = &var[i]; // 赋值为整数的地址
    }
    for (int i = 0; i < MAX; i++) {
        cout << "Value of var[" << i << "] = ";
        cout << *ptr[i] << endl;
    }
}

void fun5() {
    const char *names[MAX] = {
            "Zara Ali",
            "Hina Ali",
            "Nuha Ali",
    };

    for (int i = 0; i < MAX; i++) {
        cout << "Value of names[" << i << "] = ";
        cout << names[i] << endl;
    }
}

// 指向指针的指针（多级间接寻址）
void fun6() {
    int var;
    int *ptr;
    int **pptr;

    var = 3000;

    // 获取 var 的地址
    ptr = &var;

    // 使用运算符 & 获取 ptr 的地址
    pptr = &ptr;

    // 使用 pptr 获取值
    cout << "var 值为 :" << var << endl;
    cout << "*ptr 值为:" << *ptr << endl;
    cout << "**pptr 值为:" << **pptr << endl;
}

// 传递指针给函数

// 在写函数时应习惯性的先声明函数，然后在定义函数
void getSeconds(unsigned long *par);

void fun7() {
    unsigned long sec;
    getSeconds(&sec);

    // 输出实际值
    cout << "Number of seconds :" << sec << endl;
}

void getSeconds(unsigned long *par) {
    // 获取当前的秒数
    *par = time(NULL);
    return;
}

// 函数声明
double getAverage(int *arr, int size);

void fun8() {
    // 带有 5 个元素的整型数组
    int balance[5] = {1000, 2, 3, 17, 50};
    double avg;

    // 传递一个指向数组的指针作为参数
    avg = getAverage(balance, 5);

    // 输出返回值
    cout << "Average value is: " << avg << endl;
}

double getAverage(int *arr, int size) {
    int i, sum = 0;
    double avg;

    for (i = 0; i < size; ++i) {
        sum += arr[i];
    }

    avg = double(sum) / size;

    return avg;
}

//从函数返回指针
// 要生成和返回随机数的函数
int *getRandom() {
    static int r[10];

    // 设置种子
    srand((unsigned) time(NULL));
    for (int i = 0; i < 10; ++i) {
        r[i] = rand();
        cout << r[i] << endl;
    }

    return r;
}

void fun9() {
    // 一个指向整数的指针
    int *p;

    p = getRandom();
    for (int i = 0; i < 10; i++) {
        cout << "*(p + " << i << ") : ";
        cout << *(p + i) << endl;
    }
}